﻿#region zh-CHS 2006 - 2010 DemoSoft 团队 | en 2006-2010 DemoSoft Team

//     NOTES
// ---------------
//
// This file is a part of the MMOSE(Massively Multiplayer Online Server Engine) for .NET.
//
//                              2006-2010 DemoSoft Team
//
//
// First Version : by H.Q.Cai - mailto:caihuanqing@hotmail.com

/***************************************************************************
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU Lesser General Public License as published
 *   by the Free Software Foundation; either version 2.1 of the License, or
 *   (at your option) any later version.
 *
 ***************************************************************************/

#region zh-CHS 包含名字空间 | en Include namespace
using System;
using System.Diagnostics;
using System.Threading;
using Demo.Mmose.Core.Common;
using Demo.Mmose.Core.Common.SafeCollections;
using Demo.Mmose.Core.Util;
using System.Collections.Generic;
#endregion

namespace Demo.Mmose.Core.Entity.Suit.Spell
{
    /// <summary>
    /// 管理全部技能的调用者
    /// </summary>
    [MultiThreadedNoSupport( "zh-CHS", "当前的类所有成员没有锁定(管理仅在主世界服务开始的时候创建技能或技能效果处理调用者),不支持多线程操作" )]
    public class SpellHandlers
    {
        #region zh-CHS 共有属性 | en Public Properties
        /// <summary>
        /// 
        /// </summary>
        public int Count
        {
            get { return m_SpellHandlers.Count; }
        }
        #endregion

        #region zh-CHS 公开方法 | en Public Method

        #region zh-CHS 私有成员变量 | en Private Member Variables
        /// <summary>
        /// 
        /// </summary>
        private Dictionary<long, ISpellHandler> m_SpellHandlers = new Dictionary<long, ISpellHandler>();
        #endregion
        /// <summary>
        /// 注册数据包的处理调用者
        /// </summary>
        /// <param name="iPacketID"></param>
        /// <param name="iLength"></param>
        /// <param name="bInGame"></param>
        /// <param name="onPacketReceive"></param>
        [MultiThreadedWarning( "zh-CHS", "此处没有锁定用于内部调用的(无锁),请在主世界服务开始的时候注册全部的技能或技能效果调用,不支持多线程操作:警告!" )]
        public void Register( long spellId, ISpellHandler spellHandler )
        {
            if ( spellHandler == null )
                throw new Exception( "SpellHandlers.Register(...) - spellEffectHandler == null error!" );

            m_SpellHandlers.Add( spellId, spellHandler );
        }

        /// <summary>
        /// 获取数据包的处理调用者
        /// </summary>
        /// <param name="iPacketID"></param>
        /// <returns></returns>
        [MultiThreadedWarning( "zh-CHS", "此处没有锁定用于内部调用的(无锁),请在主世界服务开始的时候注册全部的技能或技能效果调用,不支持多线程操作:警告!" )]
        public ISpellHandler GetHandler( long spellId )
        {
            ISpellHandler spellHandler = null;
            m_SpellHandlers.TryGetValue( spellId, out spellHandler );

            return spellHandler;
        }

        /// <summary>
        /// 施法
        /// </summary>
        /// <param name="spellId"></param>
        /// <param name="spell"></param>
        /// <param name="arg"></param>
        [MultiThreadedWarning( "zh-CHS", "此处没有锁定用于内部调用的(无锁),请在主世界服务开始的时候注册全部的技能或技能效果调用,不支持多线程操作:警告!" )]
        public void Cast( long spellId, Spell spell, object arg )
        {
            ISpellHandler spellHandler = null;
            m_SpellHandlers.TryGetValue( spellId, out spellHandler );

            if ( spellHandler != null )
                spellHandler.Cast( spell, arg );
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="iPacketID"></param>
        [MultiThreadedWarning( "zh-CHS", "此处没有锁定用于内部调用的(无锁),请在主世界服务开始的时候注册全部的技能或技能效果调用,不支持多线程操作:警告!" )]
        public Spell CreateInstance( long spellId, object arg )
        {
            ISpellHandler spellHandler = null;
            m_SpellHandlers.TryGetValue( spellId, out spellHandler );

            if ( spellHandler != null )
                return spellHandler.CreateSpell( arg );
            else
                return null;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="auraId"></param>
        /// <returns></returns>
        [MultiThreadedWarning( "zh-CHS", "此处没有锁定用于内部调用的(无锁),请在主世界服务开始的时候注册全部的技能光环调用,不支持多线程操作:警告!" )]
        public SpellT CreateInstance<SpellT>( long spellId, object arg ) where SpellT : Spell
        {
            ISpellHandler spellHandler = null;
            m_SpellHandlers.TryGetValue( spellId, out spellHandler );

            if ( spellHandler != null )
                return spellHandler.CreateSpell( arg ) as SpellT;
            else
                return null;
        }

        #endregion
    }
}
#endregion